-- SPDX-License-Identifier: GPL-3.0-or-later

--------------------------------------------------
--为了重写HP机制不得不从hp.lua搬过来的东西
--------------------------------------------------

-- local damage_nature_table = {
--   [fk.NormalDamage] = "normal_damage",
--   [fk.FireDamage] = "fire_damage",
--   [fk.ThunderDamage] = "thunder_damage",
--   [fk.IceDamage] = "ice_damage",
-- }

-- local function sendDamageLog(room, damageStruct)
--   if damageStruct.from then
--     room:sendLog{
--       type = "#Damage",
--       to = {damageStruct.from.id},
--       from = damageStruct.to.id,
--       arg = damageStruct.damage,
--       arg2 = damage_nature_table[damageStruct.damageType],
--     }
--   else
--     room:sendLog{
--       type = "#DamageWithNoFrom",
--       from = damageStruct.to.id,
--       arg = damageStruct.damage,
--       arg2 = damage_nature_table[damageStruct.damageType],
--     }
--   end
--   room:sendLogEvent("Damage", {
--     to = damageStruct.to.id,
--     damageType = damage_nature_table[damageStruct.damageType],
--     damageNum = damageStruct.damage,
--   })
-- end

--------------------------------------------------
--标记清理者（回合结束版）
--TODO:清理需要规避的东西还没完善;global与否以及怎么放进系统待定
--TODO2:目前已做完的需要纳管的技能（龙息，抹挑，连奏，袭穴，芳仙，视幻，忆狩，娇惰）
--TODO3:失去技能后对标记的处理可以在一键删除姬里面处理（龙息，视幻（待定），袭穴）。
--TODO4:各类基础信息统计
--------------------------------------------------

-- local turn_end_clear_mark = {}  --回合结束清除的标记
-- local mark_cleaner = fk.CreateTriggerSkill{
--   name = "mark_cleaner",
--   global = true,
--   refresh_events = {fk.EventPhaseChanging},
--   can_refresh = function(self, event, target, player, data)
--     return data.from ~= Player.NotActive and data.to == Player.NotActive
--   end,
--   on_refresh = function(self, event, target, player, data)
--     local room = player.room
--     for _, p in ipairs(turn_end_clear_mark) do
--       room:setPlayerMark(player, p, 0)
--     end
--   end,
-- }

--Fk:addSkill(mark_cleaner)

--------------------------------------------------
--出牌阶段造成多少伤害
--------------------------------------------------

-- local damage_checker_phase = fk.CreateTriggerSkill{
--   name = "#damage_checker_phase",
--   global = true,
--   refresh_events = {fk.Damage},
--   can_refresh = function(self, event, target, player, data)
--     return target == player and player:hasSkill(self.name)
--   end,
--   on_refresh = function(self, event, target, player, data)
--     local room = player.room
--     local damage = data
--     room:addPlayerMark(player, "#play_damage-phase", damage.damage)
--   end,
-- }

--Fk:addSkill(damage_checker_phase)

--------------------------------------------------
--机制调整：血量回复判定及溢出描述（暂时能用，希望别出事了）
--现有情况：改变最大体力/回复体力时，如果体力最大值<体力，则将体力强制调整至体力最大值。【其实受到伤害/流失体力可能也会，这个要不要动后续再说——目前的阻碍是伤害数据导入失败（难道再绑个临时mark？有毒吧），流失体力莫名直接失效。】
--规避方式：血量回复前，确认目前的最大体力及体力，如最大体力小于体力，则打标记并增加最大体力；
--           注释：血量回复时需要注意优先级问题。
--         血量变化前，若你未受伤，重写相关逻辑后return true
--           注释：这个阶段如果后续被证明不靠谱，建议注释掉，然后在前后两个阶段用两段log解释maxHp的提升。
--         血量回复时，如果原因非滋养【待补充】且存在标记，直接降低最大体力
--           （待定，这条可能有别的逻辑问题，可以考虑做个extra_data.quanju = true避免这个触发其他事件）

-- TODO：
--         （单独做个技能？）血量回复时，如果溢出，增加对应的mark
--         （单独做个技能？）最大体力变动时，不会将体力强行下调至最大体力；最大体力和体力若下降则下降等量数量（这个如果要做，需要涉及濒危判定，以及需要后续FK开发组写出beforeMaxHpChanged时机，这里才能对源码进行重塑）。
--         （单独做个技能+函数）血量回复时，如果原因为滋养，读取滋养最大体力值，如体力+回复体力>=滋养最大体力，不回复体力
--------------------------------------------------

-- local v_hp = fk.CreateTriggerSkill{
--   --（刚需）技能认证名
--   name = "v_hp",
--   global = true,
--   mute = true,
--   --技能为锁定技，满足条件后强制发动
--   frequency = Skill.Compulsory,
--   --时机：体力回复前，体力回复时，体力变化前
--   events = {fk.PreHpRecover, fk.BeforeHpChanged, fk.HpRecover},
--   --触发条件：
--   --（体力回复前）触发时机的角色为遍历到的角色，遍历到的角色存活且在场；
--   --              遍历到的角色的体力大于最大体力。
--   --（体力变化前）触发时机的角色为遍历到的角色，遍历到的角色存活且在场；
--   --              体力变化的原因为回复且数值大于0；
--   --              遍历到的角色未受伤
--   --              （暂时删除）遍历到的角色的体力大于最大体力。
--   --（体力回复时）触发时机的角色为遍历到的角色，遍历到的角色存活且在场；
--   --              遍历到的角色存在特定标记；
--   --              待补充：extra_data的ziyang为false。
--   can_trigger = function(self, event, target, player, data)
--     --local room = player.room
--     if event == fk.PreHpRecover then
--       return target == player and player:isAlive()
--         and player.hp > player.maxHp
--     elseif event == fk.BeforeHpChanged then
--       return target == player and player:isAlive()
--         and data.num > 0 and data.reason == "recover"
--         and (not player:isWounded()) 
--         -- and player:getMark("v_hpvsmaxhp1") > 0
--     elseif event == fk.HpRecover then
--       return target == player and player:isAlive()
--         and player:getMark("v_hpvsmaxhp1") > 0
--     end
--   end,
--   on_use = function(self, event, target, player, data)
--     local room = player.room
--     if event == fk.PreHpRecover then
--       room:setPlayerMark(player, "v_hpvsmaxhp1", player.hp - player.maxHp)
--       player.maxHp = player.hp
--     elseif event == fk.BeforeHpChanged then
--       --这玩意没用，可能需要damage一类的时机把这玩意的struct传进去，否则无效。
--       -- local p, n, r, sk, da = table.unpack(data)
--       room:broadcastProperty(player, "hp")
--       --等后续开始正式处理伤害/流失体力了再说？
--       -- if data.reason == "damage" then
--       --   --这玩意里面没有damageStruct，干
--       --   -- sendDamageLog(room, data.damageStruct)
--       --   sendDamageLog(room, da)
--       -- --因为不可理喻的原因loseHp直接失效
--       -- elseif data.reason == "loseHp" then
--       --   room:sendLog{
--       --     type = "#LoseHP",
--       --     from = player.id,
--       --     arg = 0 - data.num,
--       --   }
--       --   room:sendLogEvent("LoseHP", {})
--       -- elseif data.reason == "recover" then
--       --   if data.num > 0 and (not player:isWounded()) then
--       --     room:sendLog{
--       --       type = "#v_overHealHP",
--       --       from = player.id,
--       --       arg = data.num,
--       --     }
--       --   else
--       --     room:sendLog{
--       --       type = "#HealHP",
--       --       from = player.id,
--       --       arg = data.num,
--       --     }
--       --   end
--       -- end

--       room:sendLog{
--         type = "#v_overHealHP",
--         from = player.id,
--         arg = data.num,
--       }
--       room:sendLog{
--         type = "#v_ShowHPAndMaxHP",
--         from = player.id,
--         arg = player.hp,
--         arg2 = player.maxHp - player:getMark("v_hpvsmaxhp1"),
--       }
--       room.logic:trigger(fk.HpChanged, player, data)

--       -- （因为其他原因先加进来吧···）如果后续涉及这类恢复的技能插结居然能死人了，那么再考虑怎么加入这个吧！
--       -- if player.hp < 1 then
--       --   if data.num < 0 and not data.preventDying then
--       --     ---@type DyingStruct
--       --     local dyingStruct = {
--       --       who = player.id,
--       --       --注意这个数据目前没传进来，之后再说
--       --       damage = data.damageStruct,
--       --     }
--       --     room:enterDying(dyingStruct)
--       --   end
--       -- elseif player.dying then
--       --   player.dying = false
--       --   room:broadcastProperty(player, "dying")
--       -- end

--       -- room.logic:trigger(fk.HpRecover, player, data)
--       -- if room.logic:trigger(fk.HpChanged, player, data) then
--       -- room.logic:breakEvent()
--       -- end
--       return true
--     elseif event == fk.HpRecover then
--       player.maxHp = player.maxHp - player:getMark("v_hpvsmaxhp1")
--       -- if player.maxHp <= player.hp then
--       --   room:sendLog{
--       --     type = "#v_overHealHP",
--       --     from = player.id,
--       --     arg = data.num,
--       --   }
--       -- end
--       -- room:sendLog{
--       --   type = "#v_ShowHPAndMaxHP",
--       --   from = player.id,
--       --   arg = player.hp,
--       --   arg2 = player.maxHp,
--       -- }
--       room:setPlayerMark(player, "v_hpvsmaxhp1", 0)
--     end
--   end,
-- }

-- Fk:addSkill(v_hp)

--------------------------------------------------
--特殊机制：滋养（待定）
--------------------------------------------------